# 查询参数有的在 URL，有的用的是 query， post put 用 body，就为了传更多的参数且不在 URL 里显示
# 相应的，fastapi 有 Path() Query()，针对 body 的这种情况，又有了 Body()

from typing import Annotated

from fastapi import FastAPI, Path, Body
from pydantic import BaseModel

app = FastAPI()


class Item(BaseModel):
    name: str
    description: str | None = None
    price: float
    tax: float | None = None


class User(BaseModel):
    username: str
    full_name: str | None = None


@app.post("/items/{item_id}")
async def update_item(
        item_id: Annotated[int, Path(ge=0, le=1000)],
        q: str | None = None,
        item: Item | None = None,  # 这里会按模型转成 json
):
    results = {"item_id": item_id}
    # 根据参数用 update 动态拼接数据返回
    if q:
        results.update({"q": q})
    if item:
        results.update({"item": item})
    return results


# 多个查询模型
@app.post("/items2/{item_id}")
async def update_item2(
        item_id: int, item: Item, user: User, importance: Annotated[int, Body(gt=10)]  # Body() 来了，同样的带校验的
):
    results = {"item_id": item_id, "item": item, "user": user, "importance": importance}
    return results

# Body 的 embed: 最外层用 item 包裹一下
@app.post("/items3/{item_id}")
async def update_item(item_id: int, item: Annotated[Item, Body(embed=True)]):
    results = {"item_id": item_id, "item": item}
    return results